GdkWaylandDeviceData *device = data;
GdkWaylandDeviceManager *device_manager =
GDK_WAYLAND_DEVICE_MANAGER(device->device_manager);
+ GdkWaylandDisplay *display = GDK_WAYLAND_DISPLAY (device->display);
if ((caps & WL_SEAT_CAPABILITY_POINTER) && !device->wl_pointer)
{
_gdk_device_set_associated_device (device->pointer, device->keyboard);
_gdk_device_set_associated_device (device->keyboard, device->pointer);
}
+
+ /* Once we have the capabilities event we know we have all events
+ * from the wl_seat and need no further init roundtrips. */
+ display->init_ref_count--;
}
static const struct wl_seat_listener seat_listener = {
if (strcmp(interface, "wl_compositor") == 0) {
display_wayland->compositor =
wl_registry_bind(display_wayland->wl_registry, id, &wl_compositor_interface, 1);
+ display_wayland->init_ref_count--;
} else if (strcmp(interface, "wl_shm") == 0) {
display_wayland->shm =
wl_registry_bind(display_wayland->wl_registry, id, &wl_shm_interface, 1);
output =
wl_registry_bind(display_wayland->wl_registry, id, &wl_output_interface, 1);
_gdk_wayland_screen_add_output(display_wayland->screen, output);
+ /* We need to roundtrip until we've received the modes and
+ * geometry events for the output, which gives us the physical
+ * properties and available modes on the output. */
+ display_wayland->init_ref_count++;
} else if (strcmp(interface, "wl_seat") == 0) {
seat = wl_registry_bind(display_wayland->wl_registry, id, &wl_seat_interface, 1);
_gdk_wayland_device_manager_add_device (gdk_display->device_manager,
seat);
+ /* We need to roundtrip until we've received the wl_seat
+ * capabilities event which informs us of available input devices
+ * on this seat. */
+ display_wayland->init_ref_count++;
} else if (strcmp(interface, "wl_data_device_manager") == 0) {
display_wayland->data_device_manager =
wl_registry_bind(display_wayland->wl_registry, id,
display_wayland->wl_registry = wl_display_get_registry(display_wayland->wl_display);
wl_registry_add_listener(display_wayland->wl_registry, ®istry_listener, display_wayland);
- wl_display_dispatch(display_wayland->wl_display);
+ /* We use init_ref_count to track whether some part of our
+ * initialization still needs a roundtrip to complete. */
+ display_wayland->init_ref_count = 1;
+ while (display_wayland->init_ref_count > 0)
+ wl_display_roundtrip(display_wayland->wl_display);
display_wayland->event_source =
_gdk_wayland_display_event_source_new (display);
struct _GdkWaylandMonitor
{
+ GdkWaylandScreen *screen;
struct wl_output *output;
GdkRectangle geometry;
int width_mm;
int32_t transform)
{
GdkWaylandMonitor *monitor = (GdkWaylandMonitor *)data;
+ GdkWaylandDisplay *display = GDK_WAYLAND_DISPLAY (monitor->screen->display);
monitor->geometry.x = x;
monitor->geometry.y = y;
monitor->manufacturer = g_strdup (make);
monitor->output_name = g_strdup (model);
+
+ /* Once we have the geometry event we know we have all events
+ * from the wl_output and need no further init roundtrips. */
+ display->init_ref_count--;
}
static void
GdkWaylandMonitor *monitor = g_new0(GdkWaylandMonitor, 1);
monitor->output = output;
+ monitor->screen = screen_wayland;
g_ptr_array_add(screen_wayland->monitors, monitor);
wl_output_add_listener(output, &output_listener, monitor);